{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "h3Nuf-G4xJ0u"
      },
      "source": [
        "##### Copyright 2019 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "zZ81_4tLxSvd"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wNBP_f0QUTfO"
      },
      "source": [
        "# [TensorBoard.dev](https://tensorboard.dev) を使う"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DLXZ3t1PWdOp"
      },
      "source": [
        "[TensorBoard.dev](https://tensorboard.dev) は、無料で提供されている一般向けの [TensorBoard](https://tensorflow.org/tensorboard) サービスです。機械学習の実験をアップロードし、あらゆるユーザーと共有することができます。\n",
        "\n",
        "このノートブックでは、簡単なモデルをトレーニングし、TensorBoard.dev にログをアップロードする方法を学習します。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yjBn-ptXTppA"
      },
      "source": [
        "### セットアップとインポート\n",
        "\n",
        "このノートブックでは、バージョン `2.3.0` 以降でのみ利用できる TensorBoard 機能を使用します。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "L3ns52Luracm"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf\n",
        "import datetime\n",
        "from tensorboard.plugins.hparams import api as hp"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GqUABmUTT1Cl"
      },
      "source": [
        "### 簡単なモデルのトレーニングと TensorBoard ログの作成"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LZExSr2Qrc5S"
      },
      "outputs": [],
      "source": [
        "mnist = tf.keras.datasets.mnist\n",
        "\n",
        "(x_train, y_train),(x_test, y_test) = mnist.load_data()\n",
        "x_train, x_test = x_train / 255.0, x_test / 255.0\n",
        "\n",
        "def create_model():\n",
        "  return tf.keras.models.Sequential([\n",
        "    tf.keras.layers.Flatten(input_shape=(28, 28)),\n",
        "    tf.keras.layers.Dense(512, activation='relu'),\n",
        "    tf.keras.layers.Dropout(0.2),\n",
        "    tf.keras.layers.Dense(10, activation='softmax')\n",
        "  ])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FSv4C0dBrmAx"
      },
      "source": [
        "TensorBoard ログは、トレーニング中に [TensorBoard](https://www.tensorflow.org/tensorboard/get_started) と [ハイパーパラメータコールバック](https://www.tensorflow.org/tensorboard/hyperparameter_tuning_with_hparams) を Keras の Model.fit() に渡して作成します。作成後は、そのログを TensorBoard.dev にアップロードすることができます。\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "dsVjm5CrUtXm"
      },
      "outputs": [],
      "source": [
        "model = create_model()\n",
        "model.compile(\n",
        "    optimizer='adam',\n",
        "    loss='sparse_categorical_crossentropy',\n",
        "    metrics=['accuracy'])\n",
        "\n",
        "log_dir=\"logs/fit/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n",
        "tensorboard_callback = tf.keras.callbacks.TensorBoard(\n",
        "    log_dir=log_dir, histogram_freq=1)\n",
        "hparams_callback = hp.KerasCallback(log_dir, {\n",
        "    'num_relu_units': 512,\n",
        "    'dropout': 0.2\n",
        "})\n",
        "\n",
        "model.fit(\n",
        "    x=x_train, \n",
        "    y=y_train, \n",
        "    epochs=5, \n",
        "    validation_data=(x_test, y_test), \n",
        "    callbacks=[tensorboard_callback, hparams_callback])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TgF35qdzIC3T"
      },
      "source": [
        "### （Jupyter 限定）TensorBoard.dev の認証\n",
        "\n",
        "**Colab では、このステップは不要です。**\n",
        "\n",
        "このステップには、Jupyter の外部でシェルコンソールを使って認証する必要があります。ご利用のコンソールで、次のコマンドを実行してください。\n",
        "\n",
        "`tensorboard dev list`\n",
        "\n",
        "このフローの一環として、認証コードが提供されます。このコードは、サービス規約に同意する際に必要となります。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oKW8V5chyx6e"
      },
      "source": [
        "### TensorBoard.dev へのアップロード\n",
        "\n",
        "TensorBoard ログをアップロードすると、ほかの人に共有できる URL が提示されます。\n",
        "\n",
        "アップロードした TensorBoards は一般に公開されるため、機密データはアップロードしないようにしてください。\n",
        "\n",
        "logdir 全体のアップロードが完了すると、アップローダは終了します。（この動作は、`--one_shot` フラグによって指定されています。）"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "n2PvxhOkW7vn"
      },
      "outputs": [],
      "source": [
        "!tensorboard dev upload --logdir ./logs \\\n",
        "  --name \"Simple experiment with MNIST\" \\\n",
        "  --description \"Training results from https://colab.sandbox.google.com/github/tensorflow/tensorboard/blob/master/docs/tbdev_getting_started.ipynb\" \\\n",
        "  --one_shot"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5QH5k4AUNE27"
      },
      "source": [
        "各アップロードには、一意の実験 ID があり、同じディレクトリで新しいアップロードを開始する場合には、新しい実験 ID が与えられます。アップロードしたすべての実験をリストするには、次のコードを使用してください。\n",
        "\n",
        "```\n",
        "tensorboard dev list\n",
        "```"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "C2Pj3RQCNQvP"
      },
      "outputs": [],
      "source": [
        "!tensorboard dev list"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NyJsD3Ypyx6m"
      },
      "source": [
        "### TensorBoard.dev のスクリーンショット\n",
        "\n",
        "TensorBoard.dev で新しい実験に移動すると、次のように表示されます。\n",
        "\n",
        "![screenshot of TensorBoard.dev](https://gitlocalize.com/repo/4592/ja/site/en-snapshot/tensorboard/images/tbdev_getting_started.png \"TensorBoard.dev screenshot\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JcZOGmjQNWk_"
      },
      "source": [
        "### TensorBoard.dev 実験の削除\n",
        "\n",
        "アップロード済みの実験を削除するには、`delete` コマンドを使用して、削除する `experiment_id` を指定します。上記のスクリーンショットでは、experiment_id は左下（`w1lkBAOrR4eH35Y7Lg1DQQ`）に示されています。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "VSkJTT9rNWJq"
      },
      "outputs": [],
      "source": [
        "# You must replace YOUR_EXPERIMENT_ID with the value output from the previous\n",
        "# tensorboard `list` command or `upload` command.  For example\n",
        "# `tensorboard dev delete --experiment_id pQpJNh00RG2Lf1zOe9BrQA`\n",
        "\n",
        "## !tensorboard dev delete --experiment_id YOUR_EXPERIMENT_ID_HERE"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "tbdev_getting_started.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
